package repertorioInstrucciones;

import comun.Natural;

import maquina.Dato;
import maquina.PilaTrabajo;

public class Resta extends Instruccion {

	private static final long serialVersionUID = 1L;
	public Resta(){
		super();
	}
	public PilaTrabajo accion(PilaTrabajo pilaT) {

		Dato a =  (Dato) pilaT.getPila().pop();
		Dato b =  (Dato) pilaT.getPila().pop(); 
		//a es de tipo Float
		if(a.getDato() instanceof Float){
			float n1 = (Float) a.getDato();
			float res=0;
			Dato d;
			//y b de tipo Float
			if ( b.getDato() instanceof Float){
				float n2 = ((Float) b.getDato());
				res = n2 - n1;
				// y b de tipo Integer
			}else if ( b.getDato() instanceof Integer){
				int n2 = ((Integer) b.getDato());
				res = n2 - n1;
					// y b de tipo natural
			}else if (b.getDato() instanceof Natural){
				int n2 = ((Natural)b.getDato()).getValor();
				res = n2 - n1;
			}					
			d = new Dato<Float>(res);
			pilaT.getPila().push(d);
		}else if(b.getDato() instanceof Float){
			float n2 = (Float) b.getDato();
			float res=0;
			Dato d;
			if ( a.getDato() instanceof Integer){   
				int n1 = ((Integer) a.getDato());
				res = n2-n1;

			}else if (a.getDato()instanceof Natural){
				int n1 = ((Natural)a.getDato()).getValor();
				res = n2 - n1;
			}
			d = new Dato<Float>(res);
			pilaT.getPila().push(d);
		}else if(a.getDato() instanceof Integer ){
			int n1 = ((Integer) a.getDato());
			int res;
			Dato d;
			int n2;
			if (b.getDato() instanceof Natural)n2 = ((Natural)b.getDato()).getValor();
			else n2 = ((Integer)b.getDato());
			res = n2-n1;
			d = new Dato<Integer>(res);
			pilaT.getPila().push(d);
		}else if(b.getDato() instanceof Integer){
			int n1 = ((Natural)a.getDato()).getValor();
			//int n2 = ((Integer)a.getDato());
			int n2 = ((Integer)b.getDato());
			int res = n2-n1;
			Dato<Integer> d = new Dato<Integer>(res);
			pilaT.getPila().push(d);
		}else{ // los dos naturales
			int n1 = ((Natural)a.getDato()).getValor();
			int n2 = ((Natural)b.getDato()).getValor();
			int res = n2-n1;
			Dato<Natural> d = new Dato<Natural>(new Natural(res));
			pilaT.getPila().push(d);

		}
		
		return pilaT;
	}
}
